package org.light.framework.service;

import java.util.List;

import org.light.framework.bean.OperateResult;
import org.light.framework.bean.PageArgs;
import org.light.framework.bean.ResultColumn;
import org.light.framework.bean.ResultOrder;
import org.light.framework.bean.SearchArgs;
import org.light.framework.bean.UpdateColumn;

/**
 * 业务组件基接口(泛型)
 * @author de.cel
 *
 */
public interface ITService<T> extends IService {

	/**
	 * 新增
	 * @param obj
	 * @return
	 */
	OperateResult create(T obj);

	/**
	 * 批量新增
	 * @param objs
	 * @return
	 */
	OperateResult create(List<T> objs);
	
	/**
	 * 删除
	 * @param obj
	 * @return
	 */
	OperateResult delete(T obj);

	/**
	 * 批量删除
	 * @param objs
	 * @return
	 */
	OperateResult delete(List<T> objs);
	
	/**
	 * 更新
	 * @param obj
	 * @return
	 */

	OperateResult update(T obj);
	
	/**
	 * 更新（可指定更新列）
	 * @param obj
	 * @param uc
	 * @return
	 */

	OperateResult update(T obj, UpdateColumn uc);
	
	/**
	 * 批量更新
	 * @param objs
	 * @return
	 */
	OperateResult update(List<T> objs);

	/**
	 * 批量更新（可指定更新列）
	 * @param objs
	 * @param uc
	 * @return
	 */
	OperateResult update(List<T> objs, UpdateColumn uc);

	/**
	 * 求总记录条数
	 * 
	 * @return
	 */
	int count(Class<T> cls);

	/**
	 * 求总记录条数
	 * 
	 * @param args
	 * @return
	 */
	int count(Class<T> cls, SearchArgs searchArgs);

	/**
	 * 求和
	 * 
	 * @param cls
	 * @param columnName
	 * @param args
	 * @return
	 */
	Double sum(Class<T> cls, String columnName, SearchArgs searchArgs);

	/**
	 * 获取默认项， 若T实现了IDefaultable接口，则取IsDefault=true的对象,若未实现，则返回 new T();
	 * 
	 * @return
	 */
	T get(Class<T> cls);

	/**
	 * 根据唯一标识获取
	 * 
	 * @param id
	 * @return
	 */
	T get(Class<T> cls, String id);

	/**
	 * 根据唯一标识获取
	 * 
	 * @param id
	 * @param resultColumn
	 *            需要查询的属性名称列表(为空时，表示查询所有)
	 * @return
	 */
	T get(Class<T> cls, String id, ResultColumn resultColumn);

	/**
	 * 查询（返回符合条件的第一个对象）
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @return
	 */
	T get(Class<T> cls, SearchArgs searchArgs);

	/**
	 * 查询（返回符合条件的第一个对象）
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param resultColumn
	 *            需要查询的属性名称列表(为空时，表示查询所有)
	 * @return
	 */
	T get(Class<T> cls, SearchArgs searchArgs, ResultColumn resultColumn);

	/**
	 * 查询所有记录
	 * 
	 * @return
	 */
	List<T> getAll(Class<T> cls);

	/**
	 * 查询所有记录
	 * 
	 * @param resultCount
	 *            需要返回的记录 条数
	 * @return
	 */
	List<T> getAll(Class<T> cls, int resultCount);

	/**
	 * 查询所有记录
	 * 
	 * @param resultColumn
	 *            需要查询的属性名称列表(为空时，表示查询所有)
	 * @return
	 */
	List<T> getAll(Class<T> cls, ResultColumn resultColumn);

	/**
	 * 查询所有记录
	 * 
	 * @param resultColumn
	 *            需要查询的属性名称列表(为空时，表示查询所有)
	 * @param resultCount
	 *            需要返回的记录 条数
	 * @return
	 */
	List<T> getAll(Class<T> cls, ResultColumn resultColumn, int resultCount);

	/**
	 * 查询所有记录
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @return
	 */
	List<T> getAll(Class<T> cls, SearchArgs searchArgs);

	/**
	 * 查询所有记录
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param reslutCount
	 *            需要返回的记录 条数
	 * @return
	 */
	List<T> getAll(Class<T> cls, SearchArgs searchArgs, int reslutCount);

	/**
	 * 查询所有记录
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param resultColumn
	 *            需要查询的属性名称列表(为空时，表示查询所有)
	 * @return
	 */
	List<T> getAll(Class<T> cls, SearchArgs searchArgs, ResultColumn resultColumn);

	/**
	 * 查询所有记录
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param resultColumn
	 *            需要查询的属性名称列表(为空时，表示查询所有)
	 * @param reslutCount
	 *            返回的记录 条数
	 * @return
	 */
	List<T> getAll(Class<T> cls, SearchArgs searchArgs, ResultColumn resultColumn, int reslutCount);

	/**
	 * 查询所有记录
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param resultOrder
	 *            排序参数
	 * @return
	 */
	List<T> getAll(Class<T> cls, SearchArgs searchArgs, ResultOrder resultOrder);

	/**
	 * 查询所有记录
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param resultOrder
	 *            排序参数
	 * @param reslutCount
	 *            返回的记录 条数
	 * @return
	 */
	List<T> getAll(Class<T> cls, SearchArgs searchArgs, ResultOrder resultOrder, int reslutCount);

	/**
	 * 查询所有记录
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param resultOrder
	 *            排序参数
	 * @param resultColumn
	 *            需要查询的属性名称列表(为空时，表示查询所有)
	 * @return
	 */
	List<T> getAll(Class<T> cls, SearchArgs searchArgs, ResultOrder resultOrder, ResultColumn resultColumn);

	/**
	 * 查询所有
	 * 
	 * @param searchArgs
	 * @param resultOrder
	 * @param resultColumn
	 * @param resultCount
	 * @return
	 */
	List<T> getAll(Class<T> cls, SearchArgs searchArgs, ResultOrder resultOrder, ResultColumn resultColumn,
			int resultCount);

	/**
	 * 分页查询对象列表
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param pageArgs
	 *            分页参数
	 * @param modelOrder
	 *            排序参数
	 * @return
	 */
	List<T> search(Class<T> cls, SearchArgs searchArgs, PageArgs pageArgs, ResultOrder modelOrder);

	/**
	 * 分页查询对象列表
	 * 
	 * @param searchArgs
	 *            查询参数
	 * @param pageArgs
	 *            分页参数
	 * @param resultOrder
	 *            排序参数
	 * @param resultColumn
	 *            需要查询的属性名称列表(为空时，表示查询所有)
	 * @return
	 */
	List<T> search(Class<T> cls, SearchArgs searchArgs, PageArgs pageArgs, ResultOrder resultOrder,
			ResultColumn resultColumn);
}
